/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package transervfx.Vista;

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Pagination;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import javafx.util.Callback;
import javafx.util.Duration;
import transervfx.Dato.Entidad.Cliente;
import transervfx.Dato.Entidad.Localidad;
import transervfx.Dato.Entidad.LugarPersonalFrecuente;
import transervfx.Dato.Entidad.Pais;
import transervfx.Dato.Entidad.Provincia;
import transervfx.Logica.GestorCliente;
import transervfx.Logica.GestorLugar;
import transervfx.Logica.GestorPais;
import transervfx.Vista.XML.pathRecusosFXML;
import utilidades.autocompletar.ComboBoxAutoCompletar;
import utilidades.dialog.OptionPane;
import utilidades.number.IntegerTextField;

/**
 * FXML Controller class
 *
 * @author oscar
 */
public class ABMLugarPersonalFrecuente extends VentanaModal {

    private Timeline locationUpdateTimeline;
    final static private int tiempoDeRespuesta = 200;
    @FXML
    private Button botonAceptar;
    @FXML
    private ImageView iconoBuscando;
    @FXML
    private TextField calle;
    @FXML
    private TextField departamento;
    @FXML
    private IntegerTextField numero;
    @FXML
    private IntegerTextField piso;
    @FXML
    private TextField codigoPostal;
    @FXML
    private ComboBoxAutoCompletar<Localidad> localidad;
    @FXML
    private ComboBoxAutoCompletar<Provincia> provincia;
    @FXML
    private ComboBox<Pais> pais;
    @FXML
    private TableView<LugarPersonalFrecuente> tablaLugares;
    @FXML
    private TableColumn columCalle;
    @FXML
    private TableColumn columNumero;
    @FXML
    private TableColumn columDepartamento;
    @FXML
    private TableColumn columPiso;
    @FXML
    private TableColumn columCodigoPostal;
    @FXML
    private TableColumn columLocalidad;
    @FXML
    private TableColumn columProvincia;
    private final ObservableList<LugarPersonalFrecuente> dataSourceLugar;
    
    private Cliente cliente;

    public ABMLugarPersonalFrecuente(Stage ventanaPadre, String titulo, int x, int y) {
        super(ventanaPadre, titulo, x, y);
        throw new UnsupportedOperationException("NO PUEDO LLAMAR A ESTE CONSTRUCTOR, SI O SI REQUIERO UN CLIENTE");
    }

    public ABMLugarPersonalFrecuente( Cliente cliente,  Stage ventanaPadre, String titulo, int x, int y) {
        super(ventanaPadre, titulo, x, y);
      
        this.cliente=cliente;
        System.out.println("CANTIDAD DE LUGARES DE UN CLIETES EN EL NEW DE ABM: "+cliente.getLugaresPersonalesFrecuentes().size());
        ObservableList<LugarPersonalFrecuente> aux = FXCollections.observableArrayList(cliente.getLugaresPersonalesFrecuentes());
        dataSourceLugar= FXCollections.synchronizedObservableList(aux);
         
        
        if (ventanaPadre instanceof RegistrarEncomienda) {
            this.botonAceptar.setText("Elegir");
           /* setOnCloseRequest(new EventHandler<WindowEvent>() {
                public void handle(WindowEvent we) {
                    actualizarLugaresRegistrarServicio();
                    System.out.println("Stage is closing");
                }
            }); */
        }
        
        init();
      
    }
    
  
    

    public void init() {


        tablaLugares.setItems(dataSourceLugar);

        this.cargarPaicesProvinciasLocalidades();

        //introduce un Escuchador para cada Field del Filtro
        this.calle.textProperty().addListener(this.escuchadorInputTextField);
        this.numero.textProperty().addListener(this.escuchadorInputTextField);
        this.departamento.textProperty().addListener(this.escuchadorInputTextField);
        this.piso.textProperty().addListener(this.escuchadorInputTextField);
        this.localidad.valueProperty().addListener(this.escuchadorInputTextField);
        this.provincia.valueProperty().addListener(this.escuchadorInputTextField);
        this.pais.valueProperty().addListener(this.escuchadorInputTextField);


        //Hace un binding entre La columna y las propiedades del usuarioViedw
        columCalle.setCellValueFactory(
                new PropertyValueFactory<LugarPersonalFrecuente, String>("calle"));
        columNumero.setCellValueFactory(
                new PropertyValueFactory<LugarPersonalFrecuente, String>("numero"));
        columDepartamento.setCellValueFactory(
                new PropertyValueFactory<LugarPersonalFrecuente, String>("departamento"));
        columPiso.setCellValueFactory(
                new PropertyValueFactory<LugarPersonalFrecuente, String>("piso"));
        columLocalidad.setCellValueFactory(
                new PropertyValueFactory<LugarPersonalFrecuente, String>("localidad"));
        this.columProvincia.setCellValueFactory(
                new Callback<CellDataFeatures<LugarPersonalFrecuente, String>, ObservableValue<String>>() {
                    @Override
                    public ObservableValue<String> call(CellDataFeatures<LugarPersonalFrecuente, String> p) {
                        // p.getValue() returns the Person instance for a particular TableView row
                        return new SimpleStringProperty(p.getValue().getLocalidad().getProvincia().toString());
                    }
                });
        //    System.out.println("texto "+this.nroDoc.getText()+"propertytext "+this.nroDoc.textProperty()+"propertynumber "+this.nroDoc.numberProperty()+" integer"+this.nroDoc.numberProperty().getValue());
    }

    private void buscarLugaresPorFiltro() {
        List<LugarPersonalFrecuente> lugaresFiltrados = new ArrayList();
        String calle = this.calle.getText().toUpperCase();
        String numero = this.numero.getText().toUpperCase();
        String departamento = this.departamento.getText().toUpperCase();
        String piso = this.piso.getText().toUpperCase();
        String localidad = (this.localidad.getSelectionModel().isEmpty()) ? "" : this.localidad.getSelectionModel().getSelectedItem().getNombre().toUpperCase();
        String provincia = (this.provincia.getSelectionModel().isEmpty()) ? "" : this.provincia.getSelectionModel().getSelectedItem().getNombre().toUpperCase();


        synchronized (dataSourceLugar) {

            dataSourceLugar.clear();
            for (LugarPersonalFrecuente l : this.cliente.getLugaresPersonalesFrecuentes()) {

                if (l.getCalle().toUpperCase().contains(calle) 
                        && (l.getNumero() + "").contains(numero) 
                        && (l.getDepartamento()!=null & l.getDepartamento().toUpperCase().contains(departamento) )
                        && (l.getPiso()!=null & (l.getPiso() + "").contains(piso))
                        && l.getLocalidad().getNombre().toUpperCase().contains(localidad) & (l.getLocalidad().getProvincia().getNombre().toUpperCase()).contains(provincia)) {
                    lugaresFiltrados.add(l);
                }
            }

            this.dataSourceLugar.addAll(lugaresFiltrados);
        }
    }

    public void buttonCancelar(ActionEvent event) {
        //System.out.println(((Button)event.getSource()).getText());
        this.close();
        //System.exit(1);
    }

    public void buttonNuevo() throws NoSuchMethodException, IOException {
        new CrearLugarPersonalFrecuente(this, "Crear Lugar Personal Frecuente", 600, 320);
    }
    
    ChangeListener escuchadorInputTextField = new ChangeListener<Object>() {
        public void changed(
                ObservableValue observableValue,
                Object s, Object s1) {

            if(s1!=null){
            if (!s1.toString().isEmpty() || !s.toString().equals(s1)) {
                // delay location updates to we don't go too fast file typing

                iconoBuscando.setVisible(true);

                if (locationUpdateTimeline != null) {

                    locationUpdateTimeline.stop();
                }

                locationUpdateTimeline = new Timeline();
                locationUpdateTimeline.getKeyFrames().add(
                        new KeyFrame(new Duration(tiempoDeRespuesta),
                        new EventHandler<ActionEvent>() {
                            public void handle(ActionEvent actionEvent) {

                                buscarLugaresPorFiltro();
                                iconoBuscando.setVisible(false);
                            }
                        }));
                locationUpdateTimeline.play();

            }
        }}
    };

    private void cargarPaicesProvinciasLocalidades() {


        pais.setItems(FXCollections.observableArrayList(GestorPais.getInstance().paises()));


        provincia.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Provincia>() {
            @Override
            public void changed(ObservableValue<? extends Provincia> arg0, Provincia arg1, Provincia arg2) {
                if (arg2 != null) {
                    localidad.setData(GestorPais.getInstance().localidades(arg2));
                }
            }
        });


        pais.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Pais>() {
            @Override
            public void changed(ObservableValue<? extends Pais> arg0, Pais arg1, Pais arg2) {
                if (arg2 != null) {
                    provincia.setData(GestorPais.getInstance().provincias(arg2));
                }
            }
        });




    }

    @Override
    URL getURLFXML() {
        return pathRecusosFXML.class.getResource("ABMLugarPersonalFrecFXML.fxml");
    }

    //cuando lo llama la ventana de regristar encomienda este boton se tiene q llamar elegir
    public void buttonAceptar() {
        if(ventanaPadre instanceof CrearCliente ){
         close();
            return;
        }
        if(ventanaPadre instanceof RegistrarEncomienda){
         LugarPersonalFrecuente l=this.tablaLugares.getSelectionModel().getSelectedItem();
         if(l!=null){
            
         ((RegistrarEncomienda)ventanaPadre).actualizarLugarDeCliente(cliente, l);
           close();
         }else{
            OptionPane.showOptionDialog("Informacion", "Debe seleccionar un lugar frecuentes del cliente", "", OptionPane.INFORMATION_MESSAGE, null);   
         }
        
        }
        
           
    }

    public void actualizarTabla(LugarPersonalFrecuente lugarNew) {
        
        synchronized (dataSourceLugar) { 
            this.cliente.getLugaresPersonalesFrecuentes().add(lugarNew);
            if(this.ventanaPadre instanceof RegistrarEncomienda){
                GestorCliente.getInstance().actualizarCliente(cliente);
            }
            this.dataSourceLugar.add(lugarNew);
       
        }
        
    }
    
    
}
